/*
 * main.c
 *
 *  Created on: 20/04/2013
 *      Author: Mirian
 */
#include <stdio.h>
#include "Definitions.h"
#include "Message.h"
#include "process.h"
#include "Utils.h"
#include "bubblesort.h"
#include "shellsort.h"

/*
Pre:Recibe un puntero con la estructura de datos de control
Pos: Los datos de control quedan preparados para procesar el siguiente archivo
*/
void update_control_data(t_data* data_arg){
	++data_arg->idx;
	data_arg->line_size=0;
	if (data_arg->input_file) fclose(data_arg->input_file);
}


int main(int argc,char* argv[]){

	int ok_proc = STATUS_OK;
	void (*sort)(char**,int)=NULL;/*puntero a funcion de ordentamiento*/
	t_data data_arg={NULL,NULL,POS_SINGLE,0,0}; /* inicializo la estructura de argumentos */

	if ((ok_proc=(argc-1<SINGLE_ARG)?(BAD_CALL):(check_call(argv[POS_SINGLE])))==STATUS_OK) {
		if (argc-1 == SINGLE_ARG)
			data_arg.input_file=stdin;
		if (is_info(argv[POS_SINGLE]))
			Print_Option_Msg(argv[POS_SINGLE]); /*Si es ayuda/version, */
		else {												/*imprimo el mensaje correspondiente*/
			sort = (OPTION(argv[POS_SINGLE], S_BUBBLE, L_BUBBLE))?
							(&bubblesort):(&shellsort);/*elige la funcion bubblesort */
														/*o shellsort segun corresponda*/
			if (argc-1>1)
				data_arg.idx=POS_INIT_MULTIPLE_ARG;/*si recibe 1 o más archivos, la posición de inicio */
			while (1){										/*para leer los nombres pasados por argumento es 2*/
				if ((data_arg.idx >argc-1)||(UNSUCCESS_EXECUTION(ok_proc)))/*Si la ejecucion no es exitosa o ya*/
					break;									/* lei todos los argumentos, entonces se rompe el while*/
				if (argc-1!=SINGLE_ARG)
					data_arg.input_file=fopen(argv[data_arg.idx], MODE_RB);
				ok_proc=(data_arg.input_file)?load_lines(&data_arg):(BAD_FILE);
				update_control_data(&data_arg);
			}
			if (!(UNSUCCESS_EXECUTION(ok_proc))) {
				Process_stream(&data_arg,sort);
			}
		}
	}

	if (UNSUCCESS_EXECUTION(ok_proc))
		return ERROR_MSJ(ok_proc); /* Si ocurrió un */
	return EXIT_SUCCESS;				/*error, imprimo el mensaje corresp. y salgo */
}
